/*
*********************************************************************************************************
*                                              uC/TCP-IP
*                                      The Embedded TCP/IP Suite
*
*                    Copyright 2004-2021 Silicon Laboratories Inc. www.silabs.com
*
*                                 SPDX-License-Identifier: APACHE-2.0
*
*               This software is subject to an open source license and is distributed by
*                Silicon Laboratories Inc. pursuant to the terms of the Apache License,
*                    Version 2.0 available at www.apache.org/licenses/LICENSE-2.0.
*
*********************************************************************************************************
*/

/*
*********************************************************************************************************
*
*                                           NETWORK DAD LAYER
*                                     (DUPLICATION ADDRESS DETECTION
*
* Filename : net_dad.h
* Version  : V3.06.01
*********************************************************************************************************
* Note(s)  : (1) Supports Duplicate address detection as described in RFC #4862.
*********************************************************************************************************
*/

/*
*********************************************************************************************************
*********************************************************************************************************
*                                               MODULE
*********************************************************************************************************
*********************************************************************************************************
*/

#ifndef  NET_DAD_MODULE_PRESENT
#define  NET_DAD_MODULE_PRESENT



/*
*********************************************************************************************************
*********************************************************************************************************
*                                            INCLUDE FILES
*********************************************************************************************************
*********************************************************************************************************
*/

#include  "net_ipv6.h"
#include  "../../Source/net.h"

#ifdef   NET_DAD_MODULE_EN


/*
*********************************************************************************************************
*********************************************************************************************************
*                                               EXTERNS
*********************************************************************************************************
*********************************************************************************************************
*/


/*
*********************************************************************************************************
*********************************************************************************************************
*                                               DEFINES
*********************************************************************************************************
*********************************************************************************************************
*/


/*
*********************************************************************************************************
*********************************************************************************************************
*                                             DATA TYPES
*********************************************************************************************************
*********************************************************************************************************
*/

/*
*********************************************************************************************************
*                                          DAD DATA TYPE
*********************************************************************************************************
*/

typedef  struct  net_dad_obj  NET_DAD_OBJ;

typedef  void  (*NET_DAD_FNCT)(NET_IF_NBR                 if_nbr,
                               NET_DAD_OBJ               *p_dad_obj,
                               NET_IPv6_ADDR_CFG_STATUS   status);

struct net_dad_obj {
    NET_DAD_OBJ        *NextPtr;
    NET_IPv6_ADDR       Addr;
    KAL_SEM_HANDLE      SignalErr;
    KAL_SEM_HANDLE      SignalCompl;
    CPU_BOOLEAN         NotifyComplEn;
    NET_DAD_FNCT        Fnct;
};


/*
*********************************************************************************************************
*                                        DAD SIGNAL DATA TYPE
*********************************************************************************************************
*/

typedef enum net_dad_signal_type {
    NET_DAD_SIGNAL_TYPE_ERR,
    NET_DAD_SIGNAL_TYPE_COMPL,
} NET_DAD_SIGNAL_TYPE;


/*
*********************************************************************************************************
*********************************************************************************************************
*                                          GLOBAL VARIABLES
*********************************************************************************************************
*********************************************************************************************************
*/


/*
*********************************************************************************************************
*********************************************************************************************************
*                                               MACRO'S
*********************************************************************************************************
*********************************************************************************************************
*/


/*
*********************************************************************************************************
*********************************************************************************************************
*                                         FUNCTION PROTOTYPES
*********************************************************************************************************
*********************************************************************************************************
*/

void              NetDAD_Init                (       NET_ERR                 *p_err);


void              NetDAD_Start               (       NET_IF_NBR               if_nbr,
                                                     NET_IPv6_ADDR           *p_addr,
                                                     NET_IPv6_ADDR_CFG_TYPE   addr_cfg_type,
                                                     NET_DAD_FNCT             dad_hook_fnct,
                                                     NET_ERR                 *p_err);

void              NetDAD_Stop                (       NET_IF_NBR               if_nbr,
                                                     NET_DAD_OBJ             *p_dad_obj);

NET_DAD_OBJ      *NetDAD_ObjGet              (       NET_ERR                 *p_err);

void              NetDAD_ObjRelease          (       NET_DAD_OBJ             *p_dad_obj,
                                                     NET_ERR                 *p_err);

NET_DAD_OBJ      *NetDAD_ObjSrch             (       NET_IPv6_ADDR           *p_addr,
                                                     NET_ERR                 *p_err);

void              NetDAD_SignalWait          (       NET_DAD_SIGNAL_TYPE      signal_type,
                                                     NET_DAD_OBJ             *p_dad_obj,
                                                     NET_ERR                 *p_err);

void              NetDAD_Signal              (       NET_DAD_SIGNAL_TYPE      signal_type,
                                                     NET_DAD_OBJ             *p_dad_obj,
                                                     NET_ERR                 *p_err);


/*
*********************************************************************************************************
*********************************************************************************************************
*                                        CONFIGURATION ERRORS
*********************************************************************************************************
*********************************************************************************************************
*/


/*
*********************************************************************************************************
*********************************************************************************************************
*                                             MODULE END
*********************************************************************************************************
*********************************************************************************************************
*/

#endif  /* NET_DAD_MODULE_EN       */
#endif  /* NET_DAD_MODULE_PRESENT  */
